[IA64] domheap: Fix current->domain->arch.shadow_bitmap reference
authorAlex Williamson <alex.williamson@hp.com>
Thu, 17 Jan 2008 19:05:43 +0000 (12:05 -0700)
committerAlex Williamson <alex.williamson@hp.com>
Thu, 17 Jan 2008 19:05:43 +0000 (12:05 -0700)
Don't reference current->domain->arch.shadow_bitmap in dirty_bit fault handler.
Instead copy it to arch_vcpu.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/asm-offsets.c
xen/arch/ia64/xen/domain.c
xen/arch/ia64/xen/ivt.S
xen/include/asm-ia64/domain.h

index bcff61615905b4e2b534f5fe9249c7f8c35a0743..aefad7fd2b13d76272f4508b8a84acd942390121 100644 (file)
@@ -56,7 +56,6 @@ void foo(void)
        DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct vcpu, arch._thread.ksp));
        DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct vcpu, arch._thread.on_ustack));
 
-       DEFINE(IA64_VCPU_DOMAIN_OFFSET, offsetof (struct vcpu, domain));
        DEFINE(IA64_VCPU_HYPERCALL_CONTINUATION_OFS, offsetof (struct vcpu, arch.hypercall_continuation));
        DEFINE(IA64_VCPU_FP_PSR_OFFSET, offsetof (struct vcpu, arch.fp_psr));
        DEFINE(IA64_VCPU_META_RID_DT_OFFSET, offsetof (struct vcpu, arch.metaphysical_rid_dt));
@@ -79,7 +78,7 @@ void foo(void)
 
        BLANK();
 
-       DEFINE(IA64_DOMAIN_SHADOW_BITMAP_OFFSET, offsetof (struct domain, arch.shadow_bitmap));
+       DEFINE(IA64_VCPU_SHADOW_BITMAP_OFFSET, offsetof (struct vcpu, arch.shadow_bitmap));
 
        BLANK();
 
index 0ca477f1ebee151c23d8c726a69abacb08fad32c..5b3cf539ace12296d823631a3ff92bd45eef0cda 100644 (file)
@@ -1745,6 +1745,10 @@ int shadow_mode_control(struct domain *d, xen_domctl_shadow_op_t *sc)
        case XEN_DOMCTL_SHADOW_OP_OFF:
                if (shadow_mode_enabled (d)) {
                        u64 *bm = d->arch.shadow_bitmap;
+                       struct vcpu *v;
+
+                       for_each_vcpu(d, v)
+                               v->arch.shadow_bitmap = NULL;
 
                        /* Flush vhpt and tlb to restore dirty bit usage.  */
                        domain_flush_tlb_vhpt(d);
@@ -1780,9 +1784,12 @@ int shadow_mode_control(struct domain *d, xen_domctl_shadow_op_t *sc)
                        rc = -ENOMEM;
                }
                else {
+                       struct vcpu *v;
                        memset(d->arch.shadow_bitmap, 0, 
                               d->arch.shadow_bitmap_size / 8);
-                       
+
+                       for_each_vcpu(d, v)
+                               v->arch.shadow_bitmap = d->arch.shadow_bitmap;
                        /* Flush vhtp and tlb to enable dirty bit
                           virtualization.  */
                        domain_flush_tlb_vhpt(d);
index b9eb05e50c850bd5700313aea1136569dc3cf957..5803a2dfdaad831d0d056a7b8bf171912ce37f27 100644 (file)
@@ -394,11 +394,7 @@ ENTRY(dirty_bit)
        ;;
        ld8 r22=[r22]
        ;;
-       add r22=IA64_VCPU_DOMAIN_OFFSET,r22
-       ;;
-       ld8 r22=[r22]                   // read domain
-       ;;
-       add r22=IA64_DOMAIN_SHADOW_BITMAP_OFFSET,r22
+       add r22=IA64_VCPU_SHADOW_BITMAP_OFFSET,r22
        ;;
        ld8 r22=[r22]
        ;;
index a77bb31856880692987cb1d9cb7586bc3919336f..fc97386408380754a4920137c5bd29c6ccd63884 100644 (file)
@@ -259,6 +259,7 @@ struct arch_vcpu {
     unsigned long metaphysical_saved_rr0;      // from arch_domain (so is pinned)
     unsigned long metaphysical_saved_rr4;      // from arch_domain (so is pinned)
     unsigned long fp_psr;       // used for lazy float register
+    u64 *shadow_bitmap;         // from arch_domain (so is pinned)
     int breakimm;                      // from arch_domain (so is pinned)
     int starting_rid;          /* first RID assigned to domain */
     int ending_rid;            /* one beyond highest RID assigned to domain */